package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
)

func main() {
	// 创建一个map对象. 并指明内存容量
	counts := make(map[string]int)
	// 读取os.Args
	files := os.Args[0:]
	// 如果files的长度等于0
	if len(files) == 0 {
		// 这种形式的控制台输出好像是天生的异步
		log.Print("进入len(files) == 0")
		fmt.Println("进入len(files) == 0")
		countLines(os.Stdin, counts)
	} else {
		log.Print("进入len(files) != 0")
		fmt.Println("进入len(files) != 0")
		// files这里是一个字符串, 所以_是索引, arg是值
		for _, arg := range files {
			// 指定值并声明类型
			// f, err = os.Open(args)
			f, err := os.Open(arg)
			if (err != nil) {
				fmt.Println("进入err != nil")
				_, _ = fmt.Fprint(os.Stderr, "dup2: %v\n", err)
				continue
			}
			fmt.Println("进入err == nil")
			countLines(f, counts)
			err1 := f.Close()
			fmt.Println(err1)
		}
	}

	// line为key, n为值, 因为这里是以文本内容为key
	for line, n := range counts {
		if n > 1 {
			fmt.Printf("%d\t%s\n", n, line)
		}
	}
}

func countLines(f *os.File, counts map[string]int) {
	fmt.Println("进入countLines")
	input := bufio.NewScanner(f)
	for input.Scan() {
		counts[input.Text()]++
	}
	// 注册: 忽略input.Err()中可能出现的错误
}
